// 使用infer关键字来提取函数的返回值类型
// 这里的Return是一个条件类型，它接受一个类型参数T

type Return<T> = T extends (...args: any[]) => infer R ? R : never;

type sun = (a: number, b: number) => number;
type concat = (a: string, b: string) => string;

let sumResult: Return<sun>;
let concatResult: Return<concat>;


// 使用infer关键字来提取函数的参数类型
// 这里的firstArg是一个条件类型，它接受一个类型参数T
type firstArg<T> = T extends (arg1: infer A, ...args: any[]) => any ? A : never;

type fb = firstArg<(name: string, age: number) => void>; // string
type fa = firstArg<(name: number, age: string) => void>; // number